這篇是 week1, 開頭先分享資源和系列文章連結:
- 2019年的CS50: 只有英文字幕
- 導讀哈佛大學程式課程: 胡立的中文導讀
注意: 中文導讀不確定是幾年的, 有可能會有些許對不上或順序不對, 但最後重點都會講到
系列文章:
- [CS50]2019哈佛大學程式課程Week0
- [CS50]2019哈佛大學程式課程Week2
- [CS50]2019哈佛大學程式課程Week3
- [CS50]2019哈佛大學程式課程Week4
- [CS50]2019哈佛大學程式課程Week5
- [CS50]2019哈佛大學程式課程Week6
- [CS50]2019哈佛大學程式課程Week7
- [CS50]2019哈佛大學程式課程Week8
- [CS50]2019哈佛大學程式課程Week9
一開始介紹week0教的 scratch 和 C 的比較, 例如 scratch 的 repeat 怎麼寫成 C 的 for, ask 變成 get_string之類的, 但有個部分講得還不錯
不要多餘的判斷
例如程式碼如下(課程是教 C, 但我比較習慣寫 ruby 了所以用 ruby 寫):1
2
3
4
5
6
7if a > 0
pust 'It is a condition'
elsif a < 10
pust 'It is b condition'
elsif a >= 1 && a <= 10
pust 'It is c condition'
end
這個程式碼沒有錯誤, 包含所有條件, 沒有額外的狀況, 但卻不建議這樣寫, 為什麼呢?因為最後的判斷應該為 default 值
, 也就是說建議簡寫如下:1
2
3
4
5
6
7if a > 0
pust 'It is a condition'
elsif a < 10
pust 'It is b condition'
else
pust 'It is c condition'
end
除非很肯定不會有其他的狀況, 不然如果有10種以上的 condition, 很有可能發生我們沒注意到的 condition, 造成 throw error 或者 debug 的成本
執行 C 語言檔案
這邊主要理解一下當我們寫好一個 C 語言的檔案怎麼在終端機執行它
例如我們有一個 hello.c 的檔案$ clang hello hello.c
或者更簡單的$ make hello
然後這邊教一些簡單的 linux 指令, 對開發者來說基本的指令是一定要會的
這段最後教怎麼看 bug 的訊息, 通常程式碼出錯的時候都會一次噴好幾百行, 最基本的查看就是直接往最上面拉看一開始的錯誤就行, 其餘的是不斷像泡泡一層一層噴出的錯誤
不精準的電腦
這段很有趣, 早在我一開始學JS的時候就知道 0.1 + 0.2 不會真的等於 0.3, 而是等於 0.30000000000000004, 這邊沒有講很底層的東西解釋為什麼浮點數有差距
試想一下在我們人類的定義中有無窮大的實數, 譬如說即使有一千億個 9, 在這個宇宙中還是有比這一千億個 9還大的數字, 那我們的電腦儲存體是有限的, 不可能去紀錄無限的數字, 於是只能退而求其次計算出非常接近的數字, 所以才造成了 0.1 + 0.2 不會真的等於 0.3
這裡帶給我們一個有趣的觀念:永遠選擇最適當的方法
譬如說 0.1 + 0.2 不會真的等於 0.3 平常對我們來說很重要嗎?
我們有需要到與 0.3 只誤差了 0.0000000000000004 這麼精準的數字嗎?
答案是視情況
而定
假如情況是計算金融, 或者是火箭飛行路徑這種一丁點的小誤差可能就會造成巨大的財務損失時當然就是花更多的錢找出誤差小於 0.0000000000000004 直到可以接受的電腦
但我們通常用到小數點三位數就差不多了, 我們不要這麼貪心列出小數點後面這麼多位數就好
所以有時候不用追求到這麼的極致, 永遠視情況選擇最佳方案即可!